
// sys
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include <thread>
// mine
#include "util.h"

namespace net_base {
static LogHandler g_log_handler = nullptr;
static std::mutex mtx;

void SetLogHandler(LogHandler log_handler) {
  std::lock_guard<std::mutex> lock(mtx);
  g_log_handler = log_handler;
}

void __Internal_Log(const char* format, ...) {
  if (!g_log_handler) {
    // if Debug, use print 
#ifndef NDEBUG
    std::lock_guard<std::mutex> lock(mtx);
    va_list vl;
    va_start(vl, format);
    vprintf(format, vl);
    va_end(vl);
#endif 
    return;
  }

  char str[256] = {0};
  size_t sz = 256;

  va_list vl;
  va_start(vl, format);
  int ret = vsnprintf(str, sz, format, vl);
  va_end(vl);

  if (ret > 0) {
    size_t psz = static_cast<size_t>(ret);
    if (psz >= sz) {
      psz = sz;
      str[psz - 1] = '\0';
      std::lock_guard<std::mutex> lock(mtx);
      g_log_handler(str, psz);
    }
  }
}

} // namespace net_base

